﻿using System;
using System.Data;
using System.Data.Linq;
using System.Linq;
using System.Collections.Generic;
using System.Web.UI.WebControls;
using Emporium_Web.Controls;
using Emporium_Web.Enums;
using Emporium_Web.DBML;
using System.Linq.Expressions;
using System.Web.Services;


namespace Emporium_Web
{
    public partial class AvanceActividadesForm : System.Web.UI.Page
    {
        /// <summary>
        /// Es el código de Pedido de Compra
        /// </summary>
        private int MovimientoId
        {
            get { return ViewState["MovimientoId"] == null ? -1 : (int)ViewState["MovimientoId"]; }
            set { ViewState["MovimientoId"] = value; }
        }

        /// <summary>
        /// Contiene la operación que se realizará en el formulario
        /// </summary>
        private AccionesForm Operacion
        {
            get { return ViewState["Operation"] == null ? AccionesForm.Consultar : (AccionesForm)ViewState["Operation"]; }
            set { ViewState["Operation"] = value; }
        }

        /// <summary>
        /// Es el código del Detalle Seleccionado
        /// </summary>
        private int DetalleId
        {
            get { return Session["DetalleId"] == null ? -1 : (int)Session["DetalleId"]; }
            set { Session["DetalleId"] = value; }
        }

        /// <summary>
        /// Es el código del Estilo Seleccionado
        /// </summary>
        private int EstiloId
        {
            get { return Session["EstiloId"] == null ? -1 : (int)Session["EstiloId"]; }
            set { Session["EstiloId"] = value; }
        }

        /// <summary>
        /// Es el código de Tipo de Produccion
        /// </summary>
        private string TipoProduccion
        {
            get { return ViewState["TipoProduccion"] == null ? string.Empty : ViewState["TipoProduccion"].ToString(); }
            set { ViewState["TipoProduccion"] = value; }
        }

        /// <summary>
        /// Listado de Acumulado.
        /// </summary>
        private List<PR_MovimientoAcumulado> AcumuladoTemp
        {
            get
            {
                return Session["AcumuladoTemp"] == null ? null : (List<PR_MovimientoAcumulado>)Session["AcumuladoTemp"];
            }
            set
            {
                Session["AcumuladoTemp"] = value;
            }
        }

        /// <summary>
        /// Listado de Rutas Destino.
        /// </summary>
        private List<DE_RutaProduccion> RutasDestinoTemp
        {
            get
            {
                return Session["RutasDestinoTemp"] == null ? null : (List<DE_RutaProduccion>)Session["RutasDestinoTemp"];
            }
            set
            {
                Session["RutasDestinoTemp"] = value;
            }
        }

        /// <summary>
        /// Listado de Detalle.
        /// </summary>
        private List<PR_MovimientoDetalle> DetalleTemp
        {
            get
            {
                return Session["DetalleTemp"] == null ? null : (List<PR_MovimientoDetalle>)Session["DetalleTemp"];
            }
            set
            {
                Session["DetalleTemp"] = value;
            }
        }

        protected void Page_Init(object sender, EventArgs e)
        {

        }

        protected void Page_Load(object sender, EventArgs e)
        {
            warningMessage.Visible = false;
            errorMessage.Visible = false;

            try
            {
                if (!IsPostBack)
                {
                    errorMessage.Visible = false;

                    Master.ActualizaMenu(MenuPrincipal.Produccion, (int)MenuProduccion.AvanceActividades);
                    Master.AgregarBreadcrumb("Avance de Actividades", "#", true);
                    Master.AgregarBreadcrumb("Listado", "AvanceActividadesList.aspx", false);

                    int PedComId = 0;

                    if (Request.QueryString["MovimientoId"] != null && Int32.TryParse(Request.QueryString["MovimientoId"], out PedComId))
                    {
                        this.MovimientoId = PedComId;
                    }
                    else
                    {
                        this.MovimientoId = -1;
                    }

                    DetalleTemp = new List<PR_MovimientoDetalle>();
                    AcumuladoTemp = new List<PR_MovimientoAcumulado>();
                    RutasDestinoTemp = new List<DE_RutaProduccion>();

                    EstablecerComportamiento();
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        /// <summary>
        /// Prepara el formulario para la operación que se haya elegido (Agregar, Modificar o Consultar)
        /// </summary>
        private void EstablecerComportamiento()
        {
            int accion = 0;

            if (Request.QueryString["Operacion"] != null && Int32.TryParse(Request.QueryString["Operacion"].ToString(), out accion))
            {
                switch (accion)
                {
                    case (int)AccionesForm.Consultar:
                        this.Operacion = AccionesForm.Consultar;
                        Master.AgregarBreadcrumb("Consultar", "#", false);
                        CargarOrdenProduccion();
                        DeshabilitarControles();
                        btnGrabar.Visible = false;
                        break;
                    default:
                        this.Operacion = AccionesForm.Adicionar;
                        Master.AgregarBreadcrumb("Adicionar", "#", false);
                        txtFechaRegistro.Text = DateTime.Now.ToShortDateString();
                        txtUsuario.Text = Session["UserName"].ToString();
                        CargarSectoresOrigen(0,0);                      

                        CargarProcesosOrigen();
                        CargarActividadesOrigen(0);
                        CargarLineasOrigen(0, 0);

                        CargarProcesosDestino();
                        break;
                }
            }
        }

        private void CargarOrdenProduccion()
        {
            txtProcesoOrigen.Visible = true;
            txtActividadOrigen.Visible = true;
            txtSectorOrigen.Visible = true;
            txtLineaOrigen.Visible = true;
            txtProcesoDestino.Visible = true;
            txtActividadDestino.Visible = true;
            txtSectorDestino.Visible = true;
            txtLineaDestino.Visible = true;

            TablasDataContext database = new TablasDataContext();
                        
            var movimiento = database.PR_Movimiento.FirstOrDefault(c => c.Movimiento_Id == this.MovimientoId);
            var usuario = database.TG_Usuario.FirstOrDefault(c => c.Usuario_Id == movimiento.Usuario_Id);

            OrdenProduccionSearch1.CodigoSeleccionado = movimiento.OrdPro_Id;
            OrdenProduccionSearch1.DescripcionSeleccionado = movimiento.PR_OrdenProduccion.OrdPro_Descripcion;
            txtEstilo.Text = movimiento.Estilo_Id.ToString("00000");
            txtCodigo.Text = movimiento.Movimiento_Id.ToString("00000");
            txtUsuario.Text = usuario.Usuario_Codigo.ToString();
            txtFechaRegistro.Text = movimiento.Movimiento_Fecha.ToShortDateString();

            txtProcesoOrigen.Text = movimiento.Proceso_Descripcion;
            txtActividadOrigen.Text = movimiento.Actividad_Descripcion;
            txtSectorOrigen.Text = movimiento.Proveedor_Nombre;
            txtLineaOrigen.Text = movimiento.Linea_Descripcion;

            if (movimiento.ProcesoDes_Descripcion != null) txtProcesoDestino.Text = movimiento.ProcesoDes_Descripcion;
            if (movimiento.Actividad_Descripcion != null) txtActividadDestino.Text = movimiento.ActividadDes_Descripcion;
            if (movimiento.ProveedorDes_Nombre != null) txtSectorDestino.Text = movimiento.ProveedorDes_Nombre;
            if (movimiento.LineaDes_Descripcion != null) txtLineaDestino.Text = movimiento.LineaDes_Descripcion;

            if (movimiento.Movimiento_Observacion != null) txtObservacion.Text = movimiento.Movimiento_Observacion.ToString();

            ListarDetalles();

            var actividad = database.TG_Actividad.FirstOrDefault(c => c.Proceso_Id == movimiento.Proceso_Id && c.Actividad_Id == movimiento.Actividad_Id);

            if (actividad.Actividad_TipoProd == "PQT")
            {
                pnlDetallePorPaquetes.Style["display"] = "inline";
                pnlDetallePorPrendas.Style["display"] = "none";
                CargarDetallesPorPaquetes();
                gvDetallePorPaquetes.Columns[6].Visible = false;
                btnPaqueteAdicionar.Visible = false;
            }
            else
            {
                pnlDetallePorPaquetes.Style["display"] = "none";
                pnlDetallePorPrendas.Style["display"] = "inline";
                gvDetallePorPrendas.ShowFooter = false;
                gvDetallePorPrendas.Columns[4].Visible = false;
                CargarDetallesPorPrendas();                
            }           
        }

        private void DeshabilitarControles()
        {
            ddlProcesoOrigen.Visible = false;
            ddlActividadOrigen.Visible = false;
            ddlSectorOrigen.Visible = false;
            ddlLineaOrigen.Visible = false;

            ddlActividadDestino.Visible = false;
            ddlProcesoDestino.Visible = false;
            ddlSectorDestino.Visible = false;
            ddlLineaDestino.Visible = false;

            txtObservacion.Enabled = false;
        }

        protected void btnGrabar_Click(object sender, EventArgs e)
        {
            try
            {
                Grabar();
            }
            catch (Exception ex)
            {
                lblErrorMessage.Text = ex.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnAtras_Click(object sender, EventArgs e)
        {
            Response.Redirect("AvanceActividadesList.aspx");
        }

        private void Grabar()
        {
            switch (this.Operacion)
            {
                case AccionesForm.Adicionar:
                    Insertar();
                    break;
                default:
                    lblErrorMessage.Text = Resources.MensajesValidacion.InvalidOperation;
                    errorMessage.Visible = true;
                    break;
            }
        }

        private void Insertar()
        {
            TablasDataContext database = new TablasDataContext();
            bool resultado = true;

            try
            {
                string strResultado = ValidaDatos();
                if (strResultado != string.Empty)
                {
                    lblWarningMessage.Text = strResultado;
                    warningMessage.Visible = true;
                    return;
                }

                RegistrarMovimiento(database);
                
                if (this.TipoProduccion == "PRE")
                {
                    //Se actualiza el acumulado.                
                    resultado = RegistrarAcumuladoPorPrendas(database);
                }

                if (this.TipoProduccion == "PQT")
                {
                    //Se realiza la suma por Color y Talla.
                    List<PR_MovimientoDetalle> lstMovDetalle = CalcularSumaPrendas();

                    //Se insertan en la resumen paquetes.                  
                    int? movimientoID = ObtenerMovimientoID(database);

                    //Se obtiene ruta destino de origen                  
                    List<DE_RutaProduccion> lstRutasDestinoOrigen = ObtenerRutasDestinoDeOrigen(database);

                    //Se obtiene ruta destino de destino                                        
                    List<DE_RutaProduccion> lstRutasDestinoDestino = ObtenerRutasDestinoDeDestino(database);

                    RegistrarResumenPaquetes(database, movimientoID.Value, lstRutasDestinoDestino);

                    RegistrarAcumuladoPorPaquete(database, lstMovDetalle, lstRutasDestinoOrigen);
                }

                if (resultado)
                {
                    database.SubmitChanges();                    
                }
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un error al grabar");
            }
            finally
            {
                if (resultado)
                {                    
                    Response.Redirect("AvanceActividadesList.aspx");
                } 
            }
        }        

        private void RegistrarMovimiento(TablasDataContext database)
        {
            //Cargar Cabecera.
            PR_Movimiento movimiento = new PR_Movimiento();
            var usuario = database.TG_Usuario.FirstOrDefault(c => c.Usuario_Codigo == Session["UserName"].ToString());

            if (usuario != null) movimiento.Usuario_Id = usuario.Usuario_Id;
            movimiento.OrdPro_Id = OrdenProduccionSearch1.CodigoSeleccionado;
            movimiento.Estilo_Id = OrdenProduccionSearch1.EstiloSeleccionado;
            movimiento.Movimiento_Fecha = Convert.ToDateTime(txtFechaRegistro.Text);
            if (txtObservacion.Text != string.Empty) movimiento.Movimiento_Observacion = txtObservacion.Text;
            if (txtObservacion.Text != string.Empty) movimiento.Movimiento_Observacion = txtObservacion.Text;

            movimiento.Actividad_Id = Convert.ToInt32(ddlActividadOrigen.SelectedValue);
            movimiento.Actividad_Descripcion = ddlActividadOrigen.SelectedItem.Text.ToUpper();
            movimiento.Proceso_Id = Convert.ToInt32(ddlProcesoOrigen.SelectedValue);
            movimiento.Proceso_Descripcion = ddlProcesoOrigen.SelectedItem.Text.ToUpper();
            movimiento.Linea_Id = Convert.ToInt32(ddlLineaOrigen.SelectedValue);
            movimiento.Linea_Descripcion = ddlLineaOrigen.SelectedItem.Text.ToUpper();
            movimiento.Proveedor_Id = Convert.ToInt32(ddlSectorOrigen.SelectedValue);
            movimiento.Proveedor_Nombre = ddlSectorOrigen.SelectedItem.Text.ToUpper();

            movimiento.ActividadDes_Id = Convert.ToInt32(ddlActividadDestino.SelectedValue);
            movimiento.ActividadDes_Descripcion = ddlActividadDestino.SelectedItem.Text.ToUpper();
            movimiento.ProcesoDes_Id = Convert.ToInt32(ddlProcesoDestino.SelectedValue);
            movimiento.ProcesoDes_Descripcion = ddlProcesoDestino.SelectedItem.Text.ToUpper();
            movimiento.LineaDes_Id = Convert.ToInt32(ddlLineaDestino.SelectedValue);
            movimiento.LineaDes_Descripcion = ddlLineaDestino.SelectedItem.Text.ToUpper();

            movimiento.ProveedorDes_Id = Convert.ToInt32(ddlSectorDestino.SelectedValue);
            movimiento.ProveedorDes_Nombre = ddlSectorDestino.SelectedItem.Text.ToUpper();

            movimiento.PR_MovimientoDetalle = new EntitySet<PR_MovimientoDetalle>();

            //Se carga el detalle.
            foreach (var detalle in DetalleTemp)
            {
                PR_MovimientoDetalle nuevoDetalle = new PR_MovimientoDetalle()
                {
                    Combinacion_Id = detalle.Combinacion_Id,
                    MovDet_Avance = detalle.MovDet_Avance,
                    MovDet_Color = detalle.MovDet_Color,
                    MovDet_Secuencia = detalle.MovDet_Secuencia,
                    MovDet_Talla = detalle.MovDet_Talla,
                    OrdCor_Id = detalle.OrdCor_Id,
                    OrdCorPaq_Numero = detalle.OrdCorPaq_Numero,
                    Talla_Id = detalle.Talla_Id
                };
                movimiento.PR_MovimientoDetalle.Add(nuevoDetalle);
            }

            database.PR_Movimiento.InsertOnSubmit(movimiento);
        }

        private void RegistrarAcumuladoPorPaquete(TablasDataContext database, List<PR_MovimientoDetalle> lstMovDetalle, List<DE_RutaProduccion> lstRutasDestinoOrigen)
        {
            //Hay dos casos

            List<DE_RutaProduccion> lstRutasParalelasOrigen = ObtenerRutasParalelasOrigen(Convert.ToInt32(ddlProcesoOrigen.SelectedValue), Convert.ToInt32(ddlActividadOrigen.SelectedValue));
            List<DE_RutaProduccion> lstRutasParalelasDestino = ObtenerRutasParalelasDestino(Convert.ToInt32(ddlProcesoDestino.SelectedValue), Convert.ToInt32(ddlActividadDestino.SelectedValue));

            if (lstRutasParalelasOrigen.Count == 1 || (lstRutasParalelasOrigen.Count == 2 && lstRutasParalelasDestino.Count == 2))
            {
                //1. registrar acumulado para actividad origen que NO ESTE en paralelo           
                RegistrarAcumuladoPorPaqueteOrigenNoParalelo(database, lstMovDetalle, lstRutasDestinoOrigen);
            }
            else
            {
                //2. registrar acumulado para actividad origen que ESTE en paralelo
                RegistrarAcumuladoPorPaqueteOrigenParalelo(database, lstMovDetalle, lstRutasParalelasOrigen);
            }
        }

        private void RegistrarAcumuladoPorPaqueteOrigenParalelo(TablasDataContext database, List<PR_MovimientoDetalle> lstMovDetalle, List<DE_RutaProduccion> lstRutasParalelasOrigen)
        {
            foreach (var item in lstMovDetalle)
            {
                int cantidadActividades = 0;
                int cantidadEfectiva = Int32.MaxValue;

                var acumuladoOrigen = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                                                        && c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue)
                                                                                        && c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue)
                                                                                        && c.Sector_Id == Convert.ToInt32(ddlSectorOrigen.SelectedValue)
                                                                                        && c.Linea_Id == Convert.ToInt32(ddlLineaOrigen.SelectedValue)
                                                                                        && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                                                        && c.Talla_Id == item.Talla_Id
                                                                                        && c.Combinacion_Id == item.Combinacion_Id
                                                                                        );
                if (acumuladoOrigen != null)
                {
                    //Buscar actividades en paralelo en la actividad origen.
                    List<PR_MovimientoAcumulado> lstMovAcumulado = new List<PR_MovimientoAcumulado>();
                    foreach (var rutaOrigen in lstRutasParalelasOrigen)
                    {
                        var movimientoOrigen = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                && c.Proceso_Id == rutaOrigen.Proceso_Id
                                                && c.Actividad_Id == rutaOrigen.Actividad_Id                                                
                                                && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                && c.Talla_Id == item.Talla_Id
                                                && c.Combinacion_Id == item.Combinacion_Id                                               
                                                );

                        if (movimientoOrigen != null)
                        {
                            lstMovAcumulado.Add(new PR_MovimientoAcumulado()
                            {
                                Proceso_Id = movimientoOrigen.Proceso_Id,
                                Actividad_Id = movimientoOrigen.Actividad_Id,
                                Linea_Id = movimientoOrigen.Linea_Id,
                                MovAcu_Color = movimientoOrigen.MovAcu_Color,
                                MovAcu_Talla = movimientoOrigen.MovAcu_Talla,
                                Talla_Id = movimientoOrigen.Talla_Id,
                                Combinacion_Id = movimientoOrigen.Combinacion_Id,
                                MovAcu_Ingreso = movimientoOrigen.MovAcu_Ingreso,
                                MovAcu_Proceso = movimientoOrigen.MovAcu_Proceso,
                                MovAcu_Merma = 0,

                            });
                        }
                    }

                    //Se agregan los nuevos movimientos
                    foreach (var itemMov in lstMovDetalle.FindAll(c => c.Talla_Id == item.Talla_Id
                                                                    && c.Combinacion_Id == item.Combinacion_Id))
                    {
                        if (!lstMovAcumulado.Exists(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue)
                                                      && c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue)))
                        {
                            lstMovAcumulado.Add(new PR_MovimientoAcumulado()
                            {
                                Proceso_Id = Convert.ToInt32(ddlProcesoOrigen.SelectedValue),
                                Actividad_Id = Convert.ToInt32(ddlActividadOrigen.SelectedValue),
                                Linea_Id = Convert.ToInt32(ddlLineaOrigen.SelectedValue),
                                MovAcu_Color = itemMov.MovDet_Color.ToUpper(),
                                MovAcu_Talla = itemMov.MovDet_Talla,
                                Talla_Id = item.Talla_Id,
                                Combinacion_Id = itemMov.Combinacion_Id,                                
                                MovAcu_Proceso = Convert.ToInt32(itemMov.MovDet_Avance),
                                MovAcu_Merma = 0,
                            });
                        }
                        else
                        {
                            var movAcumulado = lstMovAcumulado.Find(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue) && c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue));

                            if (movAcumulado != null)
                            {
                                movAcumulado.MovAcu_Proceso += itemMov.MovDet_Avance.Value;
                            }                            
                        }
                    }

                    //Se calcula cantidad efectiva                   
                    foreach (var rutaOrigen in lstRutasParalelasOrigen)
                    {

                        var mov = lstMovAcumulado.Find(c => c.Proceso_Id == rutaOrigen.Proceso_Id &&
                                                          c.Actividad_Id == rutaOrigen.Actividad_Id);
                        if (mov != null && mov.MovAcu_Proceso > 0)
                        {
                            if (mov.MovAcu_Proceso <= cantidadEfectiva)
                            {
                                cantidadEfectiva = mov.MovAcu_Proceso;
                            }
                            cantidadActividades += 1;
                        }
                    }

                    //Se actualiza el proceso en la Actividad Origen.                       

                    acumuladoOrigen.MovAcu_Proceso += item.MovDet_Avance.Value;
                }


                if (cantidadActividades == lstRutasParalelasOrigen.Count)
                {
                    //Se insertar o actualiza en la Actividad Destino
                    var acumuladoDestino = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                                                           && c.Proceso_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue)
                                                                                           && c.Actividad_Id == Convert.ToInt32(ddlActividadDestino.SelectedValue)
                                                                                           && c.Sector_Id == Convert.ToInt32(ddlSectorDestino.SelectedValue)
                                                                                           && c.Linea_Id == Convert.ToInt32(ddlLineaDestino.SelectedValue)
                                                                                           && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                                                           && c.Talla_Id == item.Talla_Id
                                                                                           && c.Combinacion_Id == item.Combinacion_Id
                                                                                       );
                    if (acumuladoDestino == null)
                    {
                        //Si no existe se inserta acumulado para Actividad Destino                            
                        acumuladoDestino = new PR_MovimientoAcumulado();

                        acumuladoDestino.OrdPro_Id = OrdenProduccionSearch1.CodigoSeleccionado;
                        acumuladoDestino.Sector_Id = Convert.ToInt32(ddlSectorDestino.SelectedValue);
                        acumuladoDestino.Sector_Nombre = ddlSectorDestino.SelectedItem.Text.ToUpper();
                        acumuladoDestino.Proceso_Id = Convert.ToInt32(ddlProcesoDestino.SelectedValue);
                        acumuladoDestino.Proceso_Descripcion = ddlProcesoDestino.SelectedItem.Text.ToUpper();
                        acumuladoDestino.Actividad_Id = Convert.ToInt32(ddlActividadDestino.SelectedValue);
                        acumuladoDestino.Actividad_Descripcion = ddlActividadDestino.SelectedItem.Text.ToUpper();
                        acumuladoDestino.Linea_Id = Convert.ToInt32(ddlLineaDestino.SelectedValue);
                        acumuladoDestino.Linea_Descripcion = ddlLineaDestino.SelectedItem.Text.ToUpper(); ;
                        acumuladoDestino.Estilo_Id = OrdenProduccionSearch1.EstiloSeleccionado;
                        acumuladoDestino.MovAcu_Color = item.MovDet_Color.ToUpper();
                        acumuladoDestino.MovAcu_Talla = item.MovDet_Talla;
                        acumuladoDestino.Talla_Id = item.Talla_Id;
                        acumuladoDestino.Combinacion_Id = item.Combinacion_Id;
                        acumuladoDestino.MovAcu_Ingreso = cantidadEfectiva;
                        acumuladoDestino.MovAcu_Proceso = 0;
                        acumuladoDestino.MovAcu_Merma = 0;

                        database.PR_MovimientoAcumulado.InsertOnSubmit(acumuladoDestino);
                    }
                    else
                    {
                        //Se actualiza cantidad Ingreso en Actividad Destino.                            
                        acumuladoDestino.MovAcu_Ingreso = cantidadEfectiva;
                    }
                }
            }
        }
    
        private void RegistrarAcumuladoPorPaqueteOrigenNoParalelo(TablasDataContext database, List<PR_MovimientoDetalle> lstMovDetalle, List<DE_RutaProduccion> lstRutasDestinoOrigen)
        {
            foreach (var item in lstMovDetalle)
            {
                var acumuladoOrigen = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                                                        && c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue)
                                                                                        && c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue)
                                                                                        && c.Sector_Id == Convert.ToInt32(ddlSectorOrigen.SelectedValue)
                                                                                        && c.Linea_Id == Convert.ToInt32(ddlLineaOrigen.SelectedValue)
                                                                                        && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                                                        && c.Talla_Id == item.Talla_Id
                                                                                        && c.Combinacion_Id == item.Combinacion_Id
                                                                                        );
                if (acumuladoOrigen != null)
                {

                    //Se actualiza el proceso en la Actividad Origen.                        
                    if (lstRutasDestinoOrigen.Count == 1)
                    {
                        //No hay actividades en paralelo.
                        acumuladoOrigen.MovAcu_Proceso += item.MovDet_Avance.Value;
                    }
                    else
                    {
                        //existen actividades en paralelo.
                        List<PR_MovimientoAcumulado> lstMovAcumulado = new List<PR_MovimientoAcumulado>();
                        foreach (var rutaDestino in lstRutasDestinoOrigen)
                        {
                            var movimientoDestino = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                    && c.Proceso_Id == rutaDestino.Proceso_Id
                                                    && c.Actividad_Id == rutaDestino.Actividad_Id
                                                    && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                    && c.Talla_Id == item.Talla_Id
                                                    && c.Combinacion_Id == item.Combinacion_Id
                                                    );

                            if (movimientoDestino != null)
                            {
                                lstMovAcumulado.Add(new PR_MovimientoAcumulado()
                                {
                                    Proceso_Id = movimientoDestino.Proceso_Id,
                                    Actividad_Id = movimientoDestino.Actividad_Id,
                                    Linea_Id = movimientoDestino.Linea_Id,
                                    MovAcu_Color = movimientoDestino.MovAcu_Color,
                                    MovAcu_Talla = movimientoDestino.MovAcu_Talla,
                                    Talla_Id = movimientoDestino.Talla_Id,
                                    Combinacion_Id = movimientoDestino.Combinacion_Id,
                                    MovAcu_Ingreso = movimientoDestino.MovAcu_Ingreso,
                                    MovAcu_Proceso = 0,
                                    MovAcu_Merma = 0,

                                });
                            }
                        }

                        //Se agregar los nuevos movimientos
                        foreach (var itemMov in lstMovDetalle.FindAll(c => c.Talla_Id == item.Talla_Id
                                                                        && c.Combinacion_Id == item.Combinacion_Id))
                        {
                            if (!lstMovAcumulado.Exists(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue)
                                                          && c.Actividad_Id == Convert.ToInt32(ddlActividadDestino.SelectedValue)))
                            {
                                lstMovAcumulado.Add(new PR_MovimientoAcumulado()
                                {
                                    Proceso_Id = Convert.ToInt32(ddlProcesoDestino.SelectedValue),
                                    Actividad_Id = Convert.ToInt32(ddlActividadDestino.SelectedValue),
                                    Linea_Id = Convert.ToInt32(ddlLineaDestino.SelectedValue),
                                    MovAcu_Color = itemMov.MovDet_Color.ToUpper(),
                                    MovAcu_Talla = itemMov.MovDet_Talla,
                                    Talla_Id = item.Talla_Id,
                                    Combinacion_Id = itemMov.Combinacion_Id,
                                    MovAcu_Ingreso = Convert.ToInt32(itemMov.MovDet_Avance),
                                    MovAcu_Proceso = 0,
                                    MovAcu_Merma = 0,
                                });
                            }
                            else
                            {
                                lstMovAcumulado.Find(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue)
                                                          && c.Actividad_Id == Convert.ToInt32(ddlActividadDestino.SelectedValue)).MovAcu_Ingreso += itemMov.MovDet_Avance.Value;
                            }
                        }

                        //Se calcula cantidad efectiva
                        int cantidadActividades = 0;
                        int cantidadEfectiva = Int32.MaxValue;
                        foreach (var rutaDestino in lstRutasDestinoOrigen)
                        {

                            var mov = lstMovAcumulado.Find(c => c.Proceso_Id == rutaDestino.Proceso_Id &&
                                                              c.Actividad_Id == rutaDestino.Actividad_Id);
                            if (mov != null)
                            {
                                if (mov.MovAcu_Ingreso <= cantidadEfectiva)
                                {
                                    cantidadEfectiva = mov.MovAcu_Ingreso;
                                }
                                cantidadActividades += 1;
                            }
                        }

                        if (cantidadActividades == lstRutasDestinoOrigen.Count)
                        {
                            acumuladoOrigen.MovAcu_Proceso = cantidadEfectiva;
                        }
                    }

                    //Se insertar o actualiza en la Actividad Destino
                    var acumuladoDestino = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                                                           && c.Proceso_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue)
                                                                                           && c.Actividad_Id == Convert.ToInt32(ddlActividadDestino.SelectedValue)
                                                                                           && c.Sector_Id == Convert.ToInt32(ddlSectorDestino.SelectedValue)
                                                                                           && c.Linea_Id == Convert.ToInt32(ddlLineaDestino.SelectedValue)
                                                                                           && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                                                           && c.Talla_Id == item.Talla_Id
                                                                                           && c.Combinacion_Id == item.Combinacion_Id
                                                                                       );
                    if (acumuladoDestino == null)
                    {
                        //Si no existe se inserta acumulado para Actividad Destino                            
                        acumuladoDestino = new PR_MovimientoAcumulado();

                        acumuladoDestino.OrdPro_Id = OrdenProduccionSearch1.CodigoSeleccionado;
                        acumuladoDestino.Sector_Id = Convert.ToInt32(ddlSectorDestino.SelectedValue);
                        acumuladoDestino.Sector_Nombre = ddlSectorDestino.SelectedItem.Text.ToUpper();
                        acumuladoDestino.Proceso_Id = Convert.ToInt32(ddlProcesoDestino.SelectedValue);
                        acumuladoDestino.Proceso_Descripcion = ddlProcesoDestino.SelectedItem.Text.ToUpper();
                        acumuladoDestino.Actividad_Id = Convert.ToInt32(ddlActividadDestino.SelectedValue);
                        acumuladoDestino.Actividad_Descripcion = ddlActividadDestino.SelectedItem.Text.ToUpper();
                        acumuladoDestino.Linea_Id = Convert.ToInt32(ddlLineaDestino.SelectedValue);
                        acumuladoDestino.Linea_Descripcion = ddlLineaDestino.SelectedItem.Text.ToUpper(); ;
                        acumuladoDestino.Estilo_Id = OrdenProduccionSearch1.EstiloSeleccionado;
                        acumuladoDestino.MovAcu_Color = item.MovDet_Color.ToUpper();
                        acumuladoDestino.MovAcu_Talla = item.MovDet_Talla;
                        acumuladoDestino.Talla_Id = item.Talla_Id;
                        acumuladoDestino.Combinacion_Id = item.Combinacion_Id;
                        acumuladoDestino.MovAcu_Ingreso = Convert.ToInt32(item.MovDet_Avance);
                        acumuladoDestino.MovAcu_Proceso = 0;
                        acumuladoDestino.MovAcu_Merma = 0;

                        database.PR_MovimientoAcumulado.InsertOnSubmit(acumuladoDestino);
                    }
                    else
                    {
                        //Se actualiza cantidad Ingreso en Actividad Destino.                            
                        acumuladoDestino.MovAcu_Ingreso += item.MovDet_Avance.Value;
                    }
                }
            }
        }

        private List<PR_MovimientoDetalle> CalcularSumaPrendas()
        {
            List<PR_MovimientoDetalle> lstMovDetalle = new List<PR_MovimientoDetalle>();
            foreach (var item in DetalleTemp)
            {
                if (!lstMovDetalle.Exists(c => c.Combinacion_Id == item.Combinacion_Id && c.Talla_Id == item.Talla_Id))
                {
                    lstMovDetalle.Add(new PR_MovimientoDetalle()
                    {
                        Combinacion_Id = item.Combinacion_Id,
                        MovDet_Color = item.MovDet_Color,
                        Talla_Id = item.Talla_Id,
                        MovDet_Talla = item.MovDet_Talla,
                        OrdCor_Id = item.OrdCor_Id,
                        OrdCorPaq_Numero = item.OrdCorPaq_Numero,
                        MovDet_Avance = item.MovDet_Avance
                    });
                }
                else
                {
                    var detalle = lstMovDetalle.Find(c => c.Combinacion_Id == item.Combinacion_Id && c.Talla_Id == item.Talla_Id);
                    detalle.MovDet_Avance += item.MovDet_Avance;
                }
            }
            return lstMovDetalle;
        }

        private void RegistrarResumenPaquetes(TablasDataContext database, int movimientoID, List<DE_RutaProduccion> lstRutasDestinoDestino)
        {
            foreach (var item in DetalleTemp)
            {
                var paqueteOrigen = database.PR_ResumenPaquetes.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                                                    && c.Proceso_Ori_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue)
                                                                                    && c.Actividad_Ori_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue)
                                                                                    && c.Sector_Ori_Id == Convert.ToInt32(ddlSectorOrigen.SelectedValue)
                                                                                    && c.Linea_Ori_Id == Convert.ToInt32(ddlLineaOrigen.SelectedValue)
                                                                                    && c.Proceso_Des_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue)
                                                                                    && c.Actividad_Des_Id == Convert.ToInt32(ddlActividadDestino.SelectedValue)
                                                                                    && c.Linea_Des_Id == Convert.ToInt32(ddlLineaDestino.SelectedValue)
                                                                                    && c.OrdCor_Id == item.OrdCor_Id
                                                                                    && c.OrdCorPaq_Numero == item.OrdCorPaq_Numero
                                                                                    );
                if (paqueteOrigen != null)
                {
                    //Se actualiza  la Actividad Origen    
                    paqueteOrigen.Sector_Des_Id = Convert.ToInt32(ddlSectorOrigen.SelectedValue);
                    paqueteOrigen.Sector_Des_Nombre = ddlSectorOrigen.SelectedItem.Text;
                    paqueteOrigen.Movimiento_Id = movimientoID + 1;
                    paqueteOrigen.Movimiento_Fecha = DateTime.Now;

                    //Se insertar la Actividad Destino

                    PR_ResumenPaquetes paqueteDestino = null;

                    foreach (var rutaDestino in lstRutasDestinoDestino)
                    {
                        paqueteDestino = new PR_ResumenPaquetes();
                        paqueteDestino.OrdPro_Id = OrdenProduccionSearch1.CodigoSeleccionado;
                        paqueteDestino.OrdCor_Id = item.OrdCor_Id.Value;
                        paqueteDestino.OrdCorPaq_Numero = item.OrdCorPaq_Numero.Value;
                        paqueteDestino.Sector_Ori_Id = Convert.ToInt32(ddlSectorDestino.SelectedValue);
                        paqueteDestino.Sector_Ori_Nombre = ddlSectorDestino.SelectedItem.Text.ToUpper();
                        paqueteDestino.Proceso_Ori_Id = Convert.ToInt32(ddlProcesoDestino.SelectedValue);
                        paqueteDestino.Proceso_Ori_Descripcion = ddlProcesoDestino.SelectedItem.Text.ToUpper();
                        paqueteDestino.Actividad_Ori_Id = Convert.ToInt32(ddlActividadDestino.SelectedValue);
                        paqueteDestino.Actividad_Ori_Descripcion = ddlActividadDestino.SelectedItem.Text.ToUpper();
                        paqueteDestino.Linea_Ori_Id = Convert.ToInt32(ddlLineaDestino.SelectedValue);
                        paqueteDestino.Linea_Ori_Descripcion = ddlLineaDestino.SelectedItem.Text.ToUpper();

                        paqueteDestino.Sector_Des_Id = rutaDestino.Proceso_Id;
                        paqueteDestino.Sector_Des_Nombre = rutaDestino.TG_Proveedor.Proveedor_Nombre.ToUpper();
                        paqueteDestino.Proceso_Des_Id = rutaDestino.Proceso_Id;
                        paqueteDestino.Proceso_Des_Descripcion = rutaDestino.TG_Actividad.TG_Proceso.Proceso_Descripcion.ToUpper();
                        paqueteDestino.Actividad_Des_Id = rutaDestino.Actividad_Id;
                        paqueteDestino.Actividad_Des_Descripcion = rutaDestino.TG_Actividad.Actividad_Descripcion.ToUpper();

                        var lineaDestino = database.TG_Linea.FirstOrDefault(c => c.Actividad_Id == rutaDestino.Actividad_Id && c.Linea_Codigo == "000");
                        if (lineaDestino != null)
                        {
                            paqueteDestino.Linea_Des_Id = lineaDestino.Linea_Id;
                            paqueteDestino.Linea_Des_Descripcion = lineaDestino.Linea_Descripcion;
                        }

                        database.PR_ResumenPaquetes.InsertOnSubmit(paqueteDestino);
                    }
                }
            }
        }

        private bool RegistrarAcumuladoPorPrendas(TablasDataContext database)
        {
            //Hay dos casos

            List<DE_RutaProduccion> lstRutasParalelasOrigen = ObtenerRutasParalelasOrigen(Convert.ToInt32(ddlProcesoOrigen.SelectedValue), Convert.ToInt32(ddlActividadOrigen.SelectedValue));

            if (lstRutasParalelasOrigen.Count == 1)
            {
                //1. registrar acumulado para actividad origen que NO ESTE en paralelo           
                return RegistrarAcumuladoPorPrendasOrigenNoParalelo(database);
            }
            else
            {
                //2. registrar acumulado para actividad origen que ESTE en paralelo
                return RegistrarAcumuladoPorPrendasOrigenParalelo(database, lstRutasParalelasOrigen);
            }
        }

        private bool RegistrarAcumuladoPorPrendasOrigenParalelo(TablasDataContext database, List<DE_RutaProduccion> lstRutasParalelasOrigen)
        {
            foreach (var item in DetalleTemp)
            {
                int cantidadActividades = 0;
                int cantidadEfectiva = Int32.MaxValue;

                var acumuladoOrigen = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                                                                   && c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue)
                                                                                                   && c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue)
                                                                                                   && c.Sector_Id == Convert.ToInt32(ddlSectorOrigen.SelectedValue)
                                                                                                   && c.Linea_Id == Convert.ToInt32(ddlLineaOrigen.SelectedValue)
                                                                                                   && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                                                                   && c.Talla_Id == item.Talla_Id
                                                                                                   && c.Combinacion_Id == item.Combinacion_Id
                                                                                                   );
                if (acumuladoOrigen != null)
                {
                    //Se validan las cantidades.
                    if (!ValidadCantidadPorPrendas(acumuladoOrigen, item))
                    {
                        return false;
                    }                   


                    //Buscar actividades en paralelo en la actividad origen.
                    List<PR_MovimientoAcumulado> lstMovAcumulado = new List<PR_MovimientoAcumulado>();
                    foreach (var rutaOrigen in lstRutasParalelasOrigen)
                    {
                        var movimientoOrigen = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                && c.Proceso_Id == rutaOrigen.Proceso_Id
                                                && c.Actividad_Id == rutaOrigen.Actividad_Id
                                                && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                && c.Talla_Id == item.Talla_Id
                                                && c.Combinacion_Id == item.Combinacion_Id
                                                );

                        if (movimientoOrigen != null)
                        {
                            lstMovAcumulado.Add(new PR_MovimientoAcumulado()
                            {
                                Proceso_Id = movimientoOrigen.Proceso_Id,
                                Actividad_Id = movimientoOrigen.Actividad_Id,
                                Linea_Id = movimientoOrigen.Linea_Id,
                                MovAcu_Color = movimientoOrigen.MovAcu_Color,
                                MovAcu_Talla = movimientoOrigen.MovAcu_Talla,
                                Talla_Id = movimientoOrigen.Talla_Id,
                                Combinacion_Id = movimientoOrigen.Combinacion_Id,
                                MovAcu_Ingreso = movimientoOrigen.MovAcu_Ingreso,
                                MovAcu_Proceso = movimientoOrigen.MovAcu_Proceso,
                                MovAcu_Merma = 0,

                            });
                        }
                    }

                    //Se agregan los nuevos movimientos
                    foreach (var itemMov in DetalleTemp.FindAll(c => c.Talla_Id == item.Talla_Id
                                                                    && c.Combinacion_Id == item.Combinacion_Id))
                    {
                        if (!lstMovAcumulado.Exists(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue)
                                                      && c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue)))
                        {
                            lstMovAcumulado.Add(new PR_MovimientoAcumulado()
                            {
                                Proceso_Id = Convert.ToInt32(ddlProcesoOrigen.SelectedValue),
                                Actividad_Id = Convert.ToInt32(ddlActividadOrigen.SelectedValue),
                                Linea_Id = Convert.ToInt32(ddlLineaOrigen.SelectedValue),
                                MovAcu_Color = itemMov.MovDet_Color.ToUpper(),
                                MovAcu_Talla = itemMov.MovDet_Talla,
                                Talla_Id = item.Talla_Id,
                                Combinacion_Id = itemMov.Combinacion_Id,
                                MovAcu_Ingreso = Convert.ToInt32(itemMov.MovDet_Avance),
                                MovAcu_Proceso = Convert.ToInt32(itemMov.MovDet_Avance),
                                MovAcu_Merma = 0,
                            });
                        }
                        else
                        {
                            var movAcumulado = lstMovAcumulado.Find(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue) && c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue));

                            if (movAcumulado != null)
                            {
                                movAcumulado.MovAcu_Proceso += itemMov.MovDet_Avance.Value;
                            }
                        }
                    }

                    //Se calcula cantidad efectiva                   
                    foreach (var rutaOrigen in lstRutasParalelasOrigen)
                    {

                        var mov = lstMovAcumulado.Find(c => c.Proceso_Id == rutaOrigen.Proceso_Id &&
                                                          c.Actividad_Id == rutaOrigen.Actividad_Id);
                        if (mov != null && mov.MovAcu_Proceso > 0)
                        {
                            if (mov.MovAcu_Proceso <= cantidadEfectiva)
                            {
                                cantidadEfectiva = mov.MovAcu_Proceso;
                            }
                            cantidadActividades += 1;
                        }
                    }

                    //Se actualiza el proceso en la Actividad Origen.                       

                    acumuladoOrigen.MovAcu_Proceso += item.MovDet_Avance.Value;



                    if (cantidadActividades == lstRutasParalelasOrigen.Count)
                    {
                        //Se insertar o actualiza en la Actividad Destino
                        var acumuladoDestino = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                                                               && c.Proceso_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue)
                                                                                               && c.Actividad_Id == Convert.ToInt32(ddlActividadDestino.SelectedValue)
                                                                                               && c.Sector_Id == Convert.ToInt32(ddlSectorDestino.SelectedValue)
                                                                                               && c.Linea_Id == Convert.ToInt32(ddlLineaDestino.SelectedValue)
                                                                                               && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                                                               && c.Talla_Id == item.Talla_Id
                                                                                               && c.Combinacion_Id == item.Combinacion_Id
                                                                                           );
                        if (acumuladoDestino == null)
                        {

                            //Si no existe se inserta acumulado para Actividad Destino                            
                            acumuladoDestino = new PR_MovimientoAcumulado();

                            acumuladoDestino.OrdPro_Id = OrdenProduccionSearch1.CodigoSeleccionado;
                            acumuladoDestino.Sector_Id = Convert.ToInt32(ddlSectorDestino.SelectedValue);
                            acumuladoDestino.Sector_Nombre = ddlSectorDestino.SelectedItem.Text.ToUpper();
                            acumuladoDestino.Proceso_Id = Convert.ToInt32(ddlProcesoDestino.SelectedValue);
                            acumuladoDestino.Proceso_Descripcion = ddlProcesoDestino.SelectedItem.Text.ToUpper();
                            acumuladoDestino.Actividad_Id = Convert.ToInt32(ddlActividadDestino.SelectedValue);
                            acumuladoDestino.Actividad_Descripcion = ddlActividadDestino.SelectedItem.Text.ToUpper();
                            acumuladoDestino.Linea_Id = Convert.ToInt32(ddlLineaDestino.SelectedValue);
                            acumuladoDestino.Linea_Descripcion = ddlLineaDestino.SelectedItem.Text.ToUpper(); ;
                            acumuladoDestino.Estilo_Id = OrdenProduccionSearch1.EstiloSeleccionado;
                            acumuladoDestino.MovAcu_Color = item.MovDet_Color.ToUpper();
                            acumuladoDestino.MovAcu_Talla = item.MovDet_Talla;
                            acumuladoDestino.Talla_Id = item.Talla_Id;
                            acumuladoDestino.Combinacion_Id = item.Combinacion_Id;
                            acumuladoDestino.MovAcu_Ingreso = cantidadEfectiva;
                            acumuladoDestino.MovAcu_Proceso = 0;
                            acumuladoDestino.MovAcu_Merma = 0;

                            database.PR_MovimientoAcumulado.InsertOnSubmit(acumuladoDestino);
                        }
                        else
                        {
                            //Se actualiza cantidad Ingreso en Actividad Destino.                            
                            acumuladoDestino.MovAcu_Ingreso = cantidadEfectiva;
                        }
                    }
                }
            }

            return true;
        }

        private bool RegistrarAcumuladoPorPrendasOrigenNoParalelo(TablasDataContext database)
        {
            foreach (var item in DetalleTemp)
            {
                var acumuladoOrigen = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                                                                   && c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue)
                                                                                                   && c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue)
                                                                                                   && c.Sector_Id == Convert.ToInt32(ddlSectorOrigen.SelectedValue)
                                                                                                   && c.Linea_Id == Convert.ToInt32(ddlLineaOrigen.SelectedValue)
                                                                                                   && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                                                                   && c.Talla_Id == item.Talla_Id
                                                                                                   && c.Combinacion_Id == item.Combinacion_Id
                                                                                                   );
                if (acumuladoOrigen != null)
                {
                    //Se validan las cantidades.
                    if (!ValidadCantidadPorPrendas(acumuladoOrigen, item))
                    {
                        return false;
                    }

                    //Se actualiza el proceso en la Actividad Origen.                       

                    acumuladoOrigen.MovAcu_Proceso += item.MovDet_Avance.Value;

                    //Se insertar o actualiza en la Actividad Destino
                    var acumuladoDestino = database.PR_MovimientoAcumulado.FirstOrDefault(c => c.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                                                                           && c.Proceso_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue)
                                                                                           && c.Actividad_Id == Convert.ToInt32(ddlActividadDestino.SelectedValue)
                                                                                           && c.Sector_Id == Convert.ToInt32(ddlSectorDestino.SelectedValue)
                                                                                           && c.Linea_Id == Convert.ToInt32(ddlLineaDestino.SelectedValue)
                                                                                           && c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                                                                           && c.Talla_Id == item.Talla_Id
                                                                                           && c.Combinacion_Id == item.Combinacion_Id
                                                                                       );
                    if (acumuladoDestino == null)
                    {

                        //Si no existe se inserta acumulado para Actividad Destino                            
                        acumuladoDestino = new PR_MovimientoAcumulado();

                        acumuladoDestino.OrdPro_Id = OrdenProduccionSearch1.CodigoSeleccionado;
                        acumuladoDestino.Sector_Id = Convert.ToInt32(ddlSectorDestino.SelectedValue);
                        acumuladoDestino.Sector_Nombre = ddlSectorDestino.SelectedItem.Text.ToUpper();
                        acumuladoDestino.Proceso_Id = Convert.ToInt32(ddlProcesoDestino.SelectedValue);
                        acumuladoDestino.Proceso_Descripcion = ddlProcesoDestino.SelectedItem.Text.ToUpper();
                        acumuladoDestino.Actividad_Id = Convert.ToInt32(ddlActividadDestino.SelectedValue);
                        acumuladoDestino.Actividad_Descripcion = ddlActividadDestino.SelectedItem.Text.ToUpper();
                        acumuladoDestino.Linea_Id = Convert.ToInt32(ddlLineaDestino.SelectedValue);
                        acumuladoDestino.Linea_Descripcion = ddlLineaDestino.SelectedItem.Text.ToUpper(); ;
                        acumuladoDestino.Estilo_Id = OrdenProduccionSearch1.EstiloSeleccionado;
                        acumuladoDestino.MovAcu_Color = item.MovDet_Color.ToUpper();
                        acumuladoDestino.MovAcu_Talla = item.MovDet_Talla;
                        acumuladoDestino.Talla_Id = item.Talla_Id;
                        acumuladoDestino.Combinacion_Id = item.Combinacion_Id;
                        acumuladoDestino.MovAcu_Ingreso = Convert.ToInt32(item.MovDet_Avance);
                        acumuladoDestino.MovAcu_Proceso = 0;
                        acumuladoDestino.MovAcu_Merma = 0;

                        database.PR_MovimientoAcumulado.InsertOnSubmit(acumuladoDestino);
                    }
                    else
                    {
                        //Se actualiza cantidad Ingreso en Actividad Destino.                            
                        acumuladoDestino.MovAcu_Ingreso += item.MovDet_Avance.Value;
                    }
                }
            }
            return true;
        }

        private bool ValidadCantidadPorPrendas(PR_MovimientoAcumulado acumuladoOrigen, PR_MovimientoDetalle item)
        {
            if (item.MovDet_Avance == null)
            {
                lblWarningMessage.Text = "INGRESE CANTIDAD PARA ETIQUETA[" + item.MovDet_Color + "] Y TALLA[" + item.MovDet_Talla + "]";
                warningMessage.Visible = true;
                return false;
            }

            if (item.MovDet_Avance.Value > acumuladoOrigen.MovAcu_Ingreso - acumuladoOrigen.MovAcu_Proceso - acumuladoOrigen.MovAcu_Merma)
            {
                lblWarningMessage.Text = "LA CANTIDAD INGRESADA PARA ETIQUETA[" + item.MovDet_Color + "] Y TALLA[" + item.MovDet_Talla + "], DEBE SER COMO MAXIMO [" + (acumuladoOrigen.MovAcu_Ingreso - acumuladoOrigen.MovAcu_Proceso - acumuladoOrigen.MovAcu_Merma).ToString() + "]";
                warningMessage.Visible = true;
                return false;
            }

            return true;
        }

        private string ValidaDatos()
        {
            if (DetalleTemp.Count == 0)
            {
                return "No existen Detalles ingresadas.";
            }

            return string.Empty;
        }

        private List<DE_RutaProduccion> ObtenerRutasDestinoDeDestino(TablasDataContext database)
        {
            //Se obtiene ruta destino de origen
            var rutasEstilos = database.DE_RutaProduccion.ToList().FindAll(c => c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado);
            var rutasDestinoDestino = rutasEstilos.FindAll(c => c.Proceso_Id == Convert.ToInt32(Convert.ToInt32(ddlProcesoDestino.SelectedValue)) &&
                                                               c.Actividad_Id == Convert.ToInt32(Convert.ToInt32(ddlActividadDestino.SelectedValue)));
            List<DE_RutaProduccion> lstRutasDestinoDestino = new List<DE_RutaProduccion>();
            foreach (var ruta in rutasDestinoDestino)
            {
                var rutaProd = rutasEstilos.FindAll(c => c.Ruta_Orden == ruta.Ruta_Orden + 1);
                if (rutaProd != null)
                    lstRutasDestinoDestino.AddRange(rutaProd);
            }

            var actividadesParalelo = database.DE_RutaProduccion.ToList().FindAll(c => c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado && c.Ruta_Orden == lstRutasDestinoDestino[0].Ruta_Orden);

            var actividadDestino = database.DE_RutaProduccion.ToList().Find(c => c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado &&
                                                                                 c.Proceso_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue) &&
                                                                                 c.Actividad_Id == Convert.ToInt32(ddlActividadDestino.SelectedValue));

            //Estan en paralelo
            if (actividadesParalelo.Count == lstRutasDestinoDestino.Count)
            {
                lstRutasDestinoDestino = lstRutasDestinoDestino.FindAll(c => c.Ruta_SubOrden == actividadDestino.Ruta_Proximo);
            }

            return lstRutasDestinoDestino;
        }

        private List<DE_RutaProduccion> ObtenerRutasDestinoDeOrigen(TablasDataContext database)
        {
            //Se obtiene ruta destino de origen
            var actividades = RutasDestinoTemp.FindAll(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue));
            var actividadesParalelo = RutasDestinoTemp.FindAll(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoDestino.SelectedValue) && c.Ruta_Orden == actividades[0].Ruta_Orden);

            var actividadOrigen = database.DE_RutaProduccion.ToList().Find(c => c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado &&
                                                                                   c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue) &&
                                                                                   c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue));

            //Estan en paralelo
            if (actividades.Count == actividadesParalelo.Count)
            {
                actividades = actividades.FindAll(c => c.Ruta_SubOrden == actividadOrigen.Ruta_Proximo);
            }

            return actividades;
        }
        
        private List<DE_RutaProduccion> ObtenerRutasParalelasOrigen(int ProcesoID, int ActividadID)
        {
            //Se obtiene ruta destino de origen
            TablasDataContext database = new TablasDataContext();

            var rutasEstilos = database.DE_RutaProduccion.ToList().FindAll(c => c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado);
            var rutasDestinoOrigen = rutasEstilos.FindAll(c => c.Proceso_Id == ProcesoID && c.Actividad_Id == ActividadID);
            List<DE_RutaProduccion> lstRutasDestinoOrigen = new List<DE_RutaProduccion>();
            foreach (var ruta in rutasDestinoOrigen)
            {
                var rutaProd = rutasEstilos.FindAll(c => c.Ruta_Orden == ruta.Ruta_Orden);
                if (rutaProd != null)
                    lstRutasDestinoOrigen.AddRange(rutaProd);
            }
            return lstRutasDestinoOrigen;
        }

        private List<DE_RutaProduccion> ObtenerRutasParalelasDestino(int ProcesoID, int ActividadID)
        {
            //Se obtiene ruta destino de origen
            TablasDataContext database = new TablasDataContext();

            var rutasEstilos = database.DE_RutaProduccion.ToList().FindAll(c => c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado);
            var rutasDestino = rutasEstilos.FindAll(c => c.Proceso_Id == ProcesoID && c.Actividad_Id == ActividadID);
            List<DE_RutaProduccion> lstRutasDestino = new List<DE_RutaProduccion>();
            foreach (var ruta in rutasDestino)
            {
                var rutaProd = rutasEstilos.FindAll(c => c.Ruta_Orden == ruta.Ruta_Orden);
                if (rutaProd != null)
                    lstRutasDestino.AddRange(rutaProd);
            }
            return lstRutasDestino;
        }

        private int ObtenerMovimientoID(TablasDataContext database)
        {
            int? movimientoID;
            var movimientoMaximo = database.PR_Movimiento.FirstOrDefault(c => c.Movimiento_Id > 0);

            if (movimientoMaximo == null)
            {
                movimientoID = 0;
            }
            else
            {
                movimientoID = database.PR_Movimiento.Max(c => c.Movimiento_Id);
            }
            return movimientoID.Value;
        }

        private void ListarDetalles()
        {
            TablasDataContext database = new TablasDataContext();

            var listaDetalle = from detalles in database.PR_MovimientoDetalle
                               where detalles.Movimiento_Id == this.MovimientoId
                               select detalles;

            DetalleTemp = listaDetalle.ToList();
        }

        private void CargarDetallesPorPaquetes()
        {
            if (DetalleTemp.Count() > 0)
            {
                gvDetallePorPaquetes.DataSource = DetalleTemp;
                gvDetallePorPaquetes.DataBind();
            }
            else
            {
                gvDetallePorPaquetes.DataSource = new List<PR_MovimientoDetalle>() { new PR_MovimientoDetalle() };
                gvDetallePorPaquetes.DataBind();

                for (int i = 0; i < gvDetallePorPaquetes.Rows[0].Cells.Count; i++)
                {
                    gvDetallePorPaquetes.Rows[0].Cells[i].Text = "";
                }
            }
        }

        private void CargarDetallesPorPrendas()
        {
            if (DetalleTemp.Count() > 0)
            {
                gvDetallePorPrendas.DataSource = DetalleTemp;
                gvDetallePorPrendas.DataBind();
            }
            else
            {
                gvDetallePorPrendas.DataSource = new List<PR_MovimientoDetalle>() { new PR_MovimientoDetalle() };
                gvDetallePorPrendas.DataBind();

                for (int i = 0; i < gvDetallePorPrendas.Rows[0].Cells.Count; i++)
                {
                    gvDetallePorPrendas.Rows[0].Cells[i].Text = "";
                }
            }
        }

        protected void OrdenProduccionSearch_Seleccionado(object sender, EventArgs e)
        {
            txtEstilo.Text = OrdenProduccionSearch1.EstiloSeleccionado.ToString("00000");
            this.EstiloId = OrdenProduccionSearch1.EstiloSeleccionado;
            CargarAcumulado();
            CargarProcesosOrigen();
        }
        
        private void CargarAcumulado()
        {
            TablasDataContext database = new TablasDataContext();
            var usuario = Session["UserName"].ToString();

            var listAcumulado = (from acumulado in database.PR_MovimientoAcumulado
                                 join procesoUsuario in database.TG_Usuario_Proceso
                                 on acumulado.Proceso_Id equals procesoUsuario.Proceso_Id
                                 where acumulado.OrdPro_Id == OrdenProduccionSearch1.CodigoSeleccionado
                                 && acumulado.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado
                                 && acumulado.MovAcu_Ingreso - acumulado.MovAcu_Proceso - acumulado.MovAcu_Merma > 0
                                 && procesoUsuario.TG_Usuario.Usuario_Codigo == usuario
                                 select acumulado);

            if (listAcumulado.Count() > 0)
                AcumuladoTemp = listAcumulado.ToList();
        }

        private void CargarProcesosOrigen()
        {
            List<TG_Proceso> lstProceso = new List<TG_Proceso>();
            TablasDataContext database = new TablasDataContext();

            var procesos = database.TG_Proceso.ToList();

            foreach (var item in AcumuladoTemp)
            {
                if (!lstProceso.Exists(c => c.Proceso_Id == item.Proceso_Id))
                {
                    lstProceso.Add(new TG_Proceso()
                        {
                            Proceso_Id = item.Proceso_Id,
                            Proceso_Descripcion = item.Proceso_Descripcion.ToUpper()
                        });
                }
            }
            ddlProcesoOrigen.DataSource = lstProceso;
            ddlProcesoOrigen.DataValueField = "Proceso_Id";
            ddlProcesoOrigen.DataTextField = "Proceso_Descripcion";
            ddlProcesoOrigen.DataBind();
            ddlProcesoOrigen.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlProcesoOrigen.SelectedValue = "0";
        }

        private void CargarActividadesOrigen(int ProcesoID)
        {
            List<TG_Actividad> lstActividad = new List<TG_Actividad>();
            TablasDataContext database = new TablasDataContext();

            var procesos = database.TG_Proceso.ToList();

            var actividades = AcumuladoTemp.FindAll(c => c.Proceso_Id == ProcesoID);

            foreach (var item in actividades)
            {
                var actividad = database.TG_Actividad.FirstOrDefault(c => c.Actividad_Id == item.Actividad_Id);

                if (actividad.Actividad_TipoProd != "CAJ")
                {
                    if (!lstActividad.Exists(c => c.Actividad_Id == item.Actividad_Id))
                    {
                        lstActividad.Add(new TG_Actividad()
                        {
                            Actividad_Id = item.Actividad_Id,
                            Actividad_Descripcion = item.Actividad_Descripcion.ToUpper()
                        });
                    }
                }
            }
            ddlActividadOrigen.DataSource = lstActividad;
            ddlActividadOrigen.DataValueField = "Actividad_Id";
            ddlActividadOrigen.DataTextField = "Actividad_Descripcion";
            ddlActividadOrigen.DataBind();
            ddlActividadOrigen.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlActividadOrigen.SelectedValue = "0";
        }

        private void CargarLineasOrigen(int ProcesoID, int ActividadID)
        {
            List<TG_Linea> lstLinea = new List<TG_Linea>();
            TablasDataContext database = new TablasDataContext();

            var lineas = AcumuladoTemp.FindAll(c => c.Proceso_Id == ProcesoID && c.Actividad_Id == ActividadID);

            foreach (var item in lineas)
            {
                if (!lstLinea.Exists(c => c.Linea_Id == item.Linea_Id))
                {
                    lstLinea.Add(new TG_Linea()
                    {
                        Linea_Id = item.Linea_Id,
                        Linea_Descripcion = item.Linea_Descripcion.ToUpper()
                    });
                }
            }
            ddlLineaOrigen.DataSource = lstLinea;
            ddlLineaOrigen.DataValueField = "Linea_Id";
            ddlLineaOrigen.DataTextField = "Linea_Descripcion";
            ddlLineaOrigen.DataBind();
            ddlLineaOrigen.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));

            if (lstLinea.Count > 0)
                ddlLineaOrigen.SelectedIndex = 1;
            else
                ddlLineaOrigen.SelectedValue = "0";
        }

        private void CargarSectoresOrigen(int ProcesoID, int ActividadID)
        {
            TablasDataContext database = new TablasDataContext();
            List<TG_Proveedor> lstProveedor = new List<TG_Proveedor>();
            
            var proveedores = AcumuladoTemp.FindAll(c => c.Proceso_Id == ProcesoID && c.Actividad_Id == ActividadID);

            foreach (var item in proveedores)
            {
                if (!lstProveedor.Exists(c => c.Proveedor_Id == item.Sector_Id))
                {
                    lstProveedor.Add(new TG_Proveedor()
                    {
                        Proveedor_Id = item.Sector_Id,
                        Proveedor_Nombre = item.Sector_Nombre.ToUpper()
                    });
                }
            }

            ddlSectorOrigen.DataSource = lstProveedor;
            ddlSectorOrigen.DataValueField = "Proveedor_Id";
            ddlSectorOrigen.DataTextField = "Proveedor_Nombre";
            ddlSectorOrigen.DataBind();
            ddlSectorOrigen.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            if (lstProveedor.Count > 0)
                ddlSectorOrigen.SelectedIndex = 1;
            else
                ddlSectorOrigen.SelectedValue = "0";
        }

        protected void ddlProcesoOrigen_SelectedIndexChanged(object sender, EventArgs e)
        {
            var ProcesoID = Convert.ToInt32(ddlProcesoOrigen.SelectedValue);
            CargarActividadesOrigen(ProcesoID);
            CargarLineasOrigen(0, 0);
            CargarSectoresOrigen(0, 0);

            CargarRutasDestino();
            CargarProcesosDestino();           
        }

        protected void ddlActividadOrigen_SelectedIndexChanged(object sender, EventArgs e)
        {
            var ProcesoID = Convert.ToInt32(ddlProcesoOrigen.SelectedValue);
            var ActividadID = Convert.ToInt32(ddlActividadOrigen.SelectedValue);
            CargarLineasOrigen(ProcesoID, ActividadID);
            CargarSectoresOrigen(ProcesoID, ActividadID);

            CargarRutasDestino();
            CargarProcesosDestino();

            TablasDataContext database = new TablasDataContext();
            var actividad = database.TG_Actividad.FirstOrDefault(c => c.Proceso_Id == ProcesoID && c.Actividad_Id == ActividadID);

            if (actividad == null)
            {
                pnlDetallePorPaquetes.Style["display"] = "none";
                pnlDetallePorPrendas.Style["display"] = "none";
                DetalleTemp.Clear();
                return;
            }

            this.TipoProduccion = actividad.Actividad_TipoProd;
         
            if (actividad.Actividad_TipoProd == "PQT")
            {
                DetalleTemp.Clear();
                pnlDetallePorPaquetes.Style["display"] = "inline";
                pnlDetallePorPrendas.Style["display"] = "none";
                CargarDetallesPorPaquetes();
            }
            else
            {
                DetalleTemp.Clear();
                pnlDetallePorPaquetes.Style["display"] = "none";
                pnlDetallePorPrendas.Style["display"] = "inline";                                
                CargarDetallesPorPrendas();
                CargarEtiquetas();
                ddlEtiquetaNew_SelectedIndexChanged(null, null);
            }           
        }

        protected void ddlSectorOrigen_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.TipoProduccion == "PRE")
            {
                CargarDetallesPorPrendas();
                CargarEtiquetas();
                ddlEtiquetaNew_SelectedIndexChanged(null, null);                
            }
        }

        private void CargarRutasDestino()
        {
            TablasDataContext database = new TablasDataContext();
            RutasDestinoTemp.Clear();

            var rutasEstilos = database.DE_RutaProduccion.ToList().FindAll(c => c.Estilo_Id == this.EstiloId);

            var rutasOrigen = rutasEstilos.FindAll(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue) &&
                                                        c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue));

            foreach (var item in rutasOrigen)
            {
                var ruta = rutasEstilos.FindAll(c => c.Ruta_Orden == item.Ruta_Orden + 1);
                if (ruta != null)
                    RutasDestinoTemp.AddRange(ruta);
            }
        }

        private void CargarProcesosDestino()
        {
            TablasDataContext database = new TablasDataContext();
            List<TG_Proceso> lstProceso = new List<TG_Proceso>();

            foreach (var item in RutasDestinoTemp)
            {
                if (!lstProceso.Exists(c => c.Proceso_Id == item.Proceso_Id))
                {
                    lstProceso.Add(new TG_Proceso()
                    {
                        Proceso_Id = item.Proceso_Id,
                        Proceso_Descripcion = item.TG_Actividad.TG_Proceso.Proceso_Descripcion.ToUpper()
                    });
                }
            }

            ddlProcesoDestino.DataSource = lstProceso;
            ddlProcesoDestino.DataValueField = "Proceso_Id";
            ddlProcesoDestino.DataTextField = "Proceso_Descripcion";
            ddlProcesoDestino.DataBind();
            ddlProcesoDestino.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlProcesoDestino.SelectedValue = "0";

            if (lstProceso.Count > 0)
                ddlProcesoDestino.SelectedIndex = 1;
            else
                ddlProcesoDestino.SelectedValue = "0";

            ddlProcesoDestino_SelectedIndexChanged(null, null);
        }

        private void CargarActividadesDestino(int ProcesoID)
        {
            List<TG_Actividad> lstActividad = new List<TG_Actividad>();
            TablasDataContext database = new TablasDataContext();

            var procesos = database.TG_Proceso.ToList();

            var actividades = RutasDestinoTemp.FindAll(c => c.Proceso_Id == ProcesoID);
            var actividadesParalelo = RutasDestinoTemp.FindAll(c => c.Proceso_Id == ProcesoID && c.Ruta_Orden == actividades[0].Ruta_Orden);

            var actividadOrigen = database.DE_RutaProduccion.ToList().Find(c => c.Estilo_Id == OrdenProduccionSearch1.EstiloSeleccionado &&
                                                                                   c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue) &&
                                                                                   c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue));

            //Estan en paralelo
            if (actividades.Count == actividadesParalelo.Count)
            {
                actividades = actividades.FindAll(c => c.Ruta_SubOrden == actividadOrigen.Ruta_Proximo);
            }

            foreach (var item in actividades)
            {
                if (!lstActividad.Exists(c => c.Actividad_Id == item.Actividad_Id))
                {
                    lstActividad.Add(new TG_Actividad()
                    {
                        Actividad_Id = item.Actividad_Id,
                        Actividad_Descripcion = item.TG_Actividad.Actividad_Descripcion.ToUpper()
                    });
                }
            }
            ddlActividadDestino.DataSource = lstActividad;
            ddlActividadDestino.DataValueField = "Actividad_Id";
            ddlActividadDestino.DataTextField = "Actividad_Descripcion";
            ddlActividadDestino.DataBind();
            ddlActividadDestino.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));

            if (lstActividad.Count > 0)
                ddlActividadDestino.SelectedIndex = 1;
            else
                ddlActividadDestino.SelectedValue = "0";

            ddlActividadDestino_SelectedIndexChanged(null, null);
        }


        private void CargarLineasDestino(int ProcesoID, int ActividadID)
        {
            List<TG_Linea> lstLinea = new List<TG_Linea>();
            TablasDataContext database = new TablasDataContext();

            var lineas = database.TG_Linea.ToList().FindAll(c => c.Proceso_Id == ProcesoID && c.Actividad_Id == ActividadID);

            foreach (var item in lineas)
            {
                if (!lstLinea.Exists(c => c.Linea_Id == item.Linea_Id))
                {
                    lstLinea.Add(new TG_Linea()
                    {
                        Linea_Id = item.Linea_Id,
                        Linea_Descripcion = item.Linea_Descripcion.ToUpper()
                    });
                }
            }
            ddlLineaDestino.DataSource = lstLinea;
            ddlLineaDestino.DataValueField = "Linea_Id";
            ddlLineaDestino.DataTextField = "Linea_Descripcion";
            ddlLineaDestino.DataBind();
            ddlLineaDestino.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));

            if (lstLinea.Count > 0)
                ddlLineaDestino.SelectedIndex = 1;
            else
                ddlLineaDestino.SelectedValue = "0";
        }

        private void CargarSectoresDestino(int ProcesoID, int ActividadID)
        {
            TablasDataContext database = new TablasDataContext();
            var actividad = database.TG_Actividad.FirstOrDefault(c => c.Proceso_Id == ProcesoID && c.Actividad_Id == ActividadID);

            var proveedores = database.TG_Proveedor.ToList();

            ddlSectorDestino.DataSource = proveedores;
            ddlSectorDestino.DataValueField = "Proveedor_Id";
            ddlSectorDestino.DataTextField = "Proveedor_Nombre";
            ddlSectorDestino.DataBind();
            ddlSectorDestino.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));

            ddlSectorDestino.SelectedValue = ddlSectorOrigen.SelectedValue;

            if (actividad != null && actividad.Actividad_TipoDocu == "SER")
            {
                ddlSectorDestino.Enabled = true;
            }
            else
            {
                ddlSectorDestino.Enabled = false;
            }
        }

        protected void ddlProcesoDestino_SelectedIndexChanged(object sender, EventArgs e)
        {
            var ProcesoID = Convert.ToInt32(ddlProcesoDestino.SelectedValue);
            CargarActividadesDestino(ProcesoID);
        }

        protected void ddlActividadDestino_SelectedIndexChanged(object sender, EventArgs e)
        {
            var ProcesoID = Convert.ToInt32(ddlProcesoDestino.SelectedValue);
            var ActividadID = Convert.ToInt32(ddlActividadDestino.SelectedValue);
            CargarLineasDestino(ProcesoID, ActividadID);
            CargarSectoresDestino(ProcesoID, ActividadID);
        }

        protected void gvDetallePorPaquetes_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                int secuencia = Convert.ToInt32(e.Keys["MovDet_Secuencia"]);
                var proporcion = DetalleTemp.Find(c => c.MovDet_Secuencia == secuencia);

                DetalleTemp.Remove(proporcion);

                for (int i = 0; i < DetalleTemp.Count; i++)
                    DetalleTemp[i].MovDet_Secuencia = i + 1;

                CargarDetallesPorPaquetes();
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void btnPaqueteAdicionar_Click(object sender, EventArgs e)
        {

            int MovimientoId = OrdenProduccionSearch1.CodigoSeleccionado;

            if (OrdenProduccionSearch1.CodigoSeleccionado <= 0)
            {
                lblWarningMessage.Text = "Seleccione una Orden de Producción";
                warningMessage.Visible = true;
                return;
            }

            if (ddlProcesoOrigen.SelectedValue == "0")
            {
                lblWarningMessage.Text = "Seleccione un Proceso Origen";
                warningMessage.Visible = true;
                return;
            }

            if (ddlActividadOrigen.SelectedValue == "0")
            {
                lblWarningMessage.Text = "Seleccione un Actividad Origen";
                warningMessage.Visible = true;
                return;
            }

            if (ddlSectorOrigen.SelectedValue == "0")
            {
                lblWarningMessage.Text = "Seleccione un Sector Origen";
                warningMessage.Visible = true;
                return;
            }

            if (ddlLineaOrigen.SelectedValue == "0")
            {
                lblWarningMessage.Text = "Seleccione un Línea Origen";
                warningMessage.Visible = true;
                return;
            }

            ordenCortePaqueteAdd.OrdenProduccionID = OrdenProduccionSearch1.CodigoSeleccionado;
            ordenCortePaqueteAdd.ProcesoID = Convert.ToInt32(ddlProcesoOrigen.SelectedValue);
            ordenCortePaqueteAdd.ActividadID = Convert.ToInt32(ddlActividadOrigen.SelectedValue);
            ordenCortePaqueteAdd.SectorID = Convert.ToInt32(ddlSectorOrigen.SelectedValue);
            ordenCortePaqueteAdd.LineaID = Convert.ToInt32(ddlLineaOrigen.SelectedValue);
            ordenCortePaqueteAdd.ProcesoDestinoID = Convert.ToInt32(ddlProcesoDestino.SelectedValue);
            ordenCortePaqueteAdd.ActividadDestinoID = Convert.ToInt32(ddlActividadDestino.SelectedValue);

            ordenCortePaqueteAdd.ListarOrdenCortePaquetes();
        }

        protected void ordenCortePaqueteAdd_Seleccionado(object sender, EventArgs e)
        {
            try
            {
                TablasDataContext database = new TablasDataContext();
                var paquete = database.PR_OrdenCortePaquete.FirstOrDefault(c => c.OrdCor_Id == ordenCortePaqueteAdd.CodigoOrdenCorte && c.OrdCorPaq_Numero == ordenCortePaqueteAdd.NumeroPaquete);

                if (!DetalleTemp.Exists(c => c.OrdCor_Id == ordenCortePaqueteAdd.CodigoOrdenCorte && c.OrdCorPaq_Numero == ordenCortePaqueteAdd.NumeroPaquete))
                {
                    DetalleTemp.Add(new PR_MovimientoDetalle()
                    {
                        Combinacion_Id = paquete.PR_OrdenCorte.OrdCor_Combinacion_Id,
                        MovDet_Avance = Convert.ToInt32(paquete.OrdCorPaq_Prendas),
                        MovDet_Color = paquete.PR_OrdenCorte.OrdCor_Combinacion,
                        MovDet_Secuencia = DetalleTemp.Count + 1,
                        MovDet_Talla = paquete.OrdCorPaq_Talla,
                        OrdCor_Id = paquete.OrdCor_Id,
                        OrdCorPaq_Numero = paquete.OrdCorPaq_Numero,
                        Talla_Id = paquete.Talla_Id
                    });
                }

                CargarDetallesPorPaquetes();
            }
            catch (Exception)
            {
                lblErrorMessage.Text = "Error al agregar paquetes";
                errorMessage.Visible = true;
            }
        }

        protected void gvDetallePorPrendas_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            try
            {
                if (e.CommandName.Equals("Insert"))
                {
                    DropDownList ddlEtiquetaNew = (DropDownList)gvDetallePorPrendas.FooterRow.FindControl("ddlEtiquetaNew");
                    DropDownList ddlTallaNew = (DropDownList)gvDetallePorPrendas.FooterRow.FindControl("ddlTallaNew");
                    TextBox txtAvanceNew = (TextBox)gvDetallePorPrendas.FooterRow.FindControl("txtAvanceNew");


                    if (DetalleTemp.Exists(c => c.Combinacion_Id == Convert.ToInt32(ddlEtiquetaNew.SelectedValue) && c.Talla_Id == Convert.ToInt32(ddlTallaNew.SelectedValue)))
                    {
                        lblWarningMessage.Text = "Etiqueta y Talla seleccionada ya en el listado";
                        warningMessage.Visible = true;
                        return;
                    }
                    else
                    {
                        DetalleTemp.Add(new PR_MovimientoDetalle()
                        {
                            Combinacion_Id = Convert.ToInt32(ddlEtiquetaNew.SelectedValue),
                            MovDet_Avance = Convert.ToInt32(txtAvanceNew.Text),
                            MovDet_Color = ddlEtiquetaNew.SelectedItem.Text.ToUpper(),
                            MovDet_Secuencia = DetalleTemp.Count + 1,
                            MovDet_Talla = ddlTallaNew.SelectedItem.Text.ToUpper(),
                            Talla_Id = Convert.ToInt32(ddlTallaNew.SelectedValue)
                        });
                    }

                    CargarDetallesPorPrendas();
                    CargarEtiquetas();
                    ddlEtiquetaNew_SelectedIndexChanged(null, null);
                }
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        protected void gvDetallePorPrendas_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                int secuencia = Convert.ToInt32(e.Keys["MovDet_Secuencia"]);
                var proporcion = DetalleTemp.Find(c => c.MovDet_Secuencia == secuencia);

                DetalleTemp.Remove(proporcion);

                for (int i = 0; i < DetalleTemp.Count; i++)
                    DetalleTemp[i].MovDet_Secuencia = i + 1;

                CargarDetallesPorPrendas();
                CargarEtiquetas();
                ddlEtiquetaNew_SelectedIndexChanged(null, null);
            }
            catch (Exception x)
            {
                lblErrorMessage.Text = x.Message;
                errorMessage.Visible = true;
            }
        }

        private void CargarEtiquetas()
        {
            TablasDataContext database = new TablasDataContext();
            List<TG_Combinacion> listaEtiqueta = new List<TG_Combinacion>();

            ordenCortePaqueteAdd.OrdenProduccionID = OrdenProduccionSearch1.CodigoSeleccionado;
            ordenCortePaqueteAdd.ProcesoID = Convert.ToInt32(ddlProcesoOrigen.SelectedValue);
            ordenCortePaqueteAdd.ActividadID = Convert.ToInt32(ddlActividadOrigen.SelectedValue);
            ordenCortePaqueteAdd.SectorID = Convert.ToInt32(ddlSectorOrigen.SelectedValue);
            ordenCortePaqueteAdd.LineaID = Convert.ToInt32(ddlLineaOrigen.SelectedValue);


            var acumulado = AcumuladoTemp.FindAll(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue) &&
                                                     c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue) &&
                                                     c.Linea_Id == Convert.ToInt32(ddlLineaOrigen.SelectedValue) &&
                                                     c.Sector_Id == Convert.ToInt32(ddlSectorOrigen.SelectedValue));

            foreach (var item in acumulado)
            {
                if (!listaEtiqueta.Exists(c => c.Combinacion_Id == item.Combinacion_Id))
                {
                    listaEtiqueta.Add(new TG_Combinacion()
                    {
                        Combinacion_Id = item.Combinacion_Id,
                        Combinacion_Descripcion = item.MovAcu_Color.ToUpper()
                    });
                }
            }

            DropDownList ddlEtiquetaNew = ((DropDownList)gvDetallePorPrendas.FooterRow.FindControl("ddlEtiquetaNew"));
            ddlEtiquetaNew.DataSource = listaEtiqueta;
            ddlEtiquetaNew.DataValueField = "Combinacion_Id";
            ddlEtiquetaNew.DataTextField = "Combinacion_Descripcion";
            ddlEtiquetaNew.DataBind();
            ddlEtiquetaNew.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlEtiquetaNew.SelectedValue = "0";
        }

        private void CargarTallas()
        {
            TablasDataContext database = new TablasDataContext();
            List<TG_Talla> listaTalla = new List<TG_Talla>();

            ordenCortePaqueteAdd.OrdenProduccionID = OrdenProduccionSearch1.CodigoSeleccionado;
            ordenCortePaqueteAdd.ProcesoID = Convert.ToInt32(ddlProcesoOrigen.SelectedValue);
            ordenCortePaqueteAdd.ActividadID = Convert.ToInt32(ddlActividadOrigen.SelectedValue);
            ordenCortePaqueteAdd.SectorID = Convert.ToInt32(ddlSectorOrigen.SelectedValue);
            ordenCortePaqueteAdd.LineaID = Convert.ToInt32(ddlLineaOrigen.SelectedValue);

            DropDownList ddlEtiquetaNew = ((DropDownList)gvDetallePorPrendas.FooterRow.FindControl("ddlEtiquetaNew"));
            int combinacionId = 0;
            if (ddlEtiquetaNew != null && ddlEtiquetaNew.SelectedValue != "")
                combinacionId = Convert.ToInt32(ddlEtiquetaNew.SelectedValue);

            var acumulado = AcumuladoTemp.FindAll(c => c.Proceso_Id == Convert.ToInt32(ddlProcesoOrigen.SelectedValue) &&
                                                     c.Actividad_Id == Convert.ToInt32(ddlActividadOrigen.SelectedValue) &&
                                                     c.Linea_Id == Convert.ToInt32(ddlLineaOrigen.SelectedValue) &&
                                                     c.Sector_Id == Convert.ToInt32(ddlSectorOrigen.SelectedValue) &&
                                                     c.Combinacion_Id == combinacionId);

            foreach (var item in acumulado)
            {
                if (!listaTalla.Exists(c => c.Talla_Id == item.Talla_Id))
                {
                    listaTalla.Add(new TG_Talla()
                    {
                        Talla_Id = item.Talla_Id,
                        Talla_DescripcionCorta = item.MovAcu_Talla.ToUpper()
                    });
                }
            }

            DropDownList ddlTallaNew = ((DropDownList)gvDetallePorPrendas.FooterRow.FindControl("ddlTallaNew"));
            ddlTallaNew.DataSource = listaTalla;
            ddlTallaNew.DataValueField = "Talla_Id";
            ddlTallaNew.DataTextField = "Talla_DescripcionCorta";
            ddlTallaNew.DataBind();
            ddlTallaNew.Items.Insert(0, (new ListItem("--SELECCIONE--", "0")));
            ddlTallaNew.SelectedValue = "0";
        }



        protected void ddlEtiquetaNew_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (DetalleTemp.Count == 0)
                for (int i = 0; i < gvDetallePorPrendas.Rows[0].Cells.Count; i++)
                    gvDetallePorPrendas.Rows[0].Cells[i].Text = "";
            
            CargarTallas();
        }

        [WebMethod]
        public static void ActualizarAvance(int id, string cantidad)
        {
            if (!string.IsNullOrEmpty(cantidad))
            {
                AvanceActividadesForm pagina = new AvanceActividadesForm();

                var detalles = (List<Emporium_Web.DBML.PR_MovimientoDetalle>)pagina.Session["DetalleTemp"];

                var detalle = detalles.Find(c => c.MovDet_Secuencia == id);
                detalle.MovDet_Avance = Convert.ToInt32(cantidad);
            }
        }
    }
}
